class Observers {

    constructor () {
        this.observers = [];
    }

    /**
     * 添加观察者
     * @param {*} observer 
     */
    addObserver(observer) {
        this.observers.push(observer);
    }

    /**
     * 删除观察者
     * @param {*} observer 
     */
    removeObserver(observer) {
        // 删除观察者
        const index = this.observers.indexOf(observer)
        if (index !== -1) {
            this.observers.splice(index, 1)
        }
    }
    /**
     * 通知观察者更新状态
     * @param {any} data  
     */
    notifyObserver(data) {
        this.observers.forEach(observer => observer.update(data));
    }
}

class NeedUpdate {
    /**
     * 更新函数
     */
    update() {
        console.warn("no update function called");
    }
}


class Search extends NeedUpdate {
    update() {
        console.log("通知：搜索人员更新，请更新搜索功能");
    }
}

class Follow extends NeedUpdate {
    update() {
        console.log("通知：跟踪数据更新，请更新人员跟踪");
    }
}

class Heatmap extends NeedUpdate {
    update() {
        console.log("通知：人员数据更新，请更新热力图");
    }
}

// 调度中心
const observes = new Observers()

// 搜索功能
const search = new Search();
observes.addObserver(search);

// 人员跟踪功能
const follow = new Follow()
observes.addObserver(follow);

// 热力图功能
const heatmap = new Heatmap();
observes.addObserver(heatmap);
